package com.run_java_test.test2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;

public class DynamicCompiler {

    // 编译指定路径的 Java 文件，并返回编译后的 Class
    public static Class<?> compileJavaFile(String filePath) throws IOException, ClassNotFoundException {
        File file = new File(filePath);

        // 获取 Java 编译器
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        // 获取一个标准的文件管理器
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

        // 设置待编译文件
        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Collections.singletonList(file));

        // 获取编译任务
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, null, null, compilationUnits);

        // 执行编译
        boolean success = task.call();

        if (!success) {
            throw new IOException("Compilation failed for file: " + filePath);
        }

        // 获取文件的类加载器
        URLClassLoader classLoader = new URLClassLoader(new URL[]{file.getParentFile().toURI().toURL()});
        String className = file.getName().replace(".java", "");

        // 加载编译后的类
        return classLoader.loadClass(className);
    }

//    // 注册 Bean 到 Spring 容器
//    public static void registerBean(ApplicationContext context, Class<?> clazz) {
//        if (context instanceof GenericApplicationContext) {
//            GenericApplicationContext appContext = (GenericApplicationContext) context;
//            appContext.registerBean(clazz); // 将类注册为 Spring Bean
//            appContext.refresh(); // 刷新容器，确保新类能被 Spring 托管
//        }
//    }
}


// v1 不是bean版本的
//public class DynamicCompiler {
//    public static Class<?> compileJavaFile(String filePath) throws IOException, ClassNotFoundException {
//        File file = new File(filePath);
//
//        // 获取 Java 编译器
//        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//
//        // 获取一个标准的文件管理器
//        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
//
//        // 设置待编译文件
//        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Collections.singletonList(file));
//
//        // 获取编译任务
//        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, null, null, compilationUnits);
//
//        // 执行编译
//        boolean success = task.call();
//
//        if (!success) {
//            throw new IOException("Compilation failed for file: " + filePath);
//        }
//
//        // 获取文件的类加载器
//        URLClassLoader classLoader = new URLClassLoader(new URL[]{file.getParentFile().toURI().toURL()});
//        String className = file.getName().replace(".java", "");
//
//        // 加载编译后的类
//        return classLoader.loadClass(className);
//    }
//}
